80. 删除有序数组中的重复项 II

80. 删除有序数组中的重复项 II

Similar Question

leading to the advanced question

Solution Tips

方案一: 双指针

仅仅是扩展了跳过的逻辑

var removeDuplicates = function(nums, k) {
    // 只是快速指针跳过的逻辑不同而已, 跳过的元素就相当于是删除
    let slow = 0;
    let fast = 0;
    let count = 0;
    while (fast < nums.length) {
        if (nums[fast] === nums[fast - 1]) {
            if (count < 2) {
                nums[slow] = nums[fast];
                slow++;
                count++
            }
        }
        else {
            // 新元素
            nums[slow] = nums[fast];
            slow++;
            count = 1;
        }
        fast++;
    }

    return slow;

};

方案二: 针对方法一的一些优化

由于是保留 k 个相同数字,对于前 k 个数字,我们可以直接保留。

对于后面的任意数字,能够保留的前提是:与当前写入的位置前面的第 k 个元素进行比较,不相同则保留。

因为是非降序的数组, 所以对于 i < j 且, nums[i] === nums[j], 一定有 i < k < j, 满足 nums[i] = nums[k] = nums[j]

var removeDuplicates = function(nums, k = 2) {
    // 只是快速指针跳过的逻辑不同而已, 跳过的元素就相当于是删除
    // 前 k 个直接保留
    let slow = k;
    let fast = k;
    while (fast < nums.length) {
        if (nums[fast] !== nums[slow - k]) {
            nums[slow] = nums[fast];
            slow++;
        }
        fast++;
    }

    return slow;

};